package seperate_tissues;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
import java.util.regex.*;
import tf_rna_hit.Isfileexist;
import tf_rna_hit.Time;

/**
 *  2016.10.11
 * @author zhang
 *  为了画在不同组织中tf-lncRNA重复的柱状图，需要将all.hits，其中的组织拆分出来
 */
public class Main {
	public static void main(String[] args){
		if(args.length == 0 || args[0].equals("-h") || args[0].equals("--help")){
			System.out.println("如果两个参数，那么一个输入文件一个输出文件");
			System.out.println("如果只有一个参数默认输出到输入文件中");
			System.out.println("默认三列，分别是num_tfbs、num_tissue、tissue");
			return;
		}
		long begainTime = System.currentTimeMillis();
		//	先建立各种可能需要的变量
		List<tissues> tissue = new ArrayList<tissues>();
		Time time = new Time();
		String content = null;
		String header = null;
		Isfileexist test = new Isfileexist();	//	一个用来检验文件是否存在的类
		Map<String, Integer> uniq = new HashMap<String, Integer>();	//	用来统计合并tfbs结合信息的
		Pattern pattern = Pattern.compile("^num.*");	//	一个正则用来检查是否是表头，是的话就略过
		/**
		 * 特别注意这里的正则，如果要用matcher， java要求必须全部匹配中，所有.*必不可少
		 */
		File input,output;
		//	根据参数数量分别生成不同的file
		if(args.length == 1){
			input = new File(args[0]);
			output = new File(args[0]);
		}else{
			input = new File(args[0]);
			output = new File(args[1]);
		}
		
		if(!test.isExist(input)){
			return;
		}else if(!test.isOutputExist(output)){
			return;
		}
		try {
			FileReader fr = new FileReader(input);
			BufferedReader br = new BufferedReader(fr);
			
			//	添加一个正则表达式来匹配是否具有表头，看是否有数字就好了
			while((content=br.readLine()) != null){
				//	如果中了，就略过
				Matcher match = pattern.matcher(content);
				if(match.matches()){
					header = content;
				}else if(content.split("\\s+").length == 3){
					String[] contentarray = content.split("\\s+");
					String[] tissuenames = contentarray[2].split(",");	//	将最后的组织分割开
					
					List<String> tem = new ArrayList<String>();	//	一个临时list类
					
					for(String key : tissuenames){
						tem.add(key);
					}
					tissue.add(new tissues(Integer.parseInt(contentarray[0]), Integer.parseInt(contentarray[1]), tem));
				}			
			}
			br.close();
			fr.close();
			long middleTime = System.currentTimeMillis();
			time.run_time(begainTime, middleTime, "读取处理完毕,");
			System.out.println("统计相同组织中相同组织数量下的tfbs数目");
			
			//	按照组织数相同，组织名相同，统计所有的tfbs
			for(int i = 0; i < tissue.size(); i++){
				List<String> tem = tissue.get(i).getTissues();
				//	两个循环，第一个从所有的文件中提取所有的组织文件
				//	第二个循环，便利统计
				for(String key : tem){
					key = tissue.get(i).getTissue() + "\t" + key;
					if(uniq.containsKey(key)){
						uniq.put(key, uniq.get(key) + tissue.get(i).getHits());
					}else{
						uniq.put(key, tissue.get(i).getHits());
					}
				}
			}
			
			
			//	处理完毕开始输出
			FileWriter fw = new FileWriter(output);
			BufferedWriter bw = new BufferedWriter(fw);
			
			bw.write(header);
			bw.newLine();
			
			for(String key  :  uniq.keySet()){
						bw.write(uniq.get(key) + "\t" + key);
						bw.newLine();
			}
			bw.close();
			fw.close();
			
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		long endTime = System.currentTimeMillis();
		time.run_time(begainTime, endTime, "程序运行结束，");
	}
}
